package com.goofengcn.website.application.util.pager;

import java.util.List;
import java.util.Vector;

import org.hibernate.Query;

import com.goofengcn.website.web.controller.AnjieConstants;


/**
 * <p>
 * Title: 安捷货运交易平台
 * </p>
 * 
 * <p>
 * Description:
 * </p>
 * 
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * 
 * <p>
 * Company: 亿通国际 上海美华系统有限公司
 * </p>
 * 
 * @author johnson
 * @version 1.0
 */
public class PaginationSupport {
	public final static int PAGESIZE = AnjieConstants.PAGESIZE;

	private int pageSize = PAGESIZE;

	private List items;

	private int totalCount;

	private int[] indexes = new int[0];

	private int startIndex = 0;

	public PaginationSupport(List items, int totalCount) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(0);
	}

	public PaginationSupport(List items, int totalCount, int startIndex) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);
	}

	public PaginationSupport(List items, int totalCount, int pageSize,
			int startIndex) {
		setPageSize(pageSize);
		setTotalCount(totalCount);
		if (items == null)
			setItems(new Vector());
		else
			setItems(items);
		setStartIndex(startIndex);
	}

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		if (totalCount > 0) {
			this.totalCount = totalCount;
			int count = totalCount / pageSize;
			if (totalCount % pageSize > 0) {
				count++;
			}
			indexes = new int[count];
			for (int i = 0; i < count; i++) {
				indexes[i] = pageSize * i;
			}
		} else {
			this.totalCount = 0;
		}
	}

	public int[] getIndexes() {
		return indexes;
	}

	public void setIndexes(int[] indexes) {
		this.indexes = indexes;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		if (totalCount <= 0) {
			this.startIndex = 0;
		} else if (startIndex >= totalCount) {
			this.startIndex = indexes[indexes.length - 1];
		} else if (startIndex < 0) {
			this.startIndex = 0;
		} else {
			this.startIndex = indexes[startIndex / pageSize];
		}
	}

	public int getNextIndex() {
		int nextIndex = getStartIndex() + pageSize;
		if (nextIndex >= totalCount) {
			return getStartIndex();
		} else {
			return nextIndex;
		}
	}

	public int getPreviousIndex() {
		int previousIndex = getStartIndex() - pageSize;
		if (previousIndex < 0) {
			return 0;
		} else {
			return previousIndex;
		}
	}

	public PaginationSupport findPageByQuery(final Query query) {
		return findPageByQuery(query, PaginationSupport.PAGESIZE, 0);
	}

	public PaginationSupport findPageByQuery(final Query query,
			final int startIndex) {
		return findPageByQuery(query, PaginationSupport.PAGESIZE, startIndex);
	}

	public PaginationSupport findPageByQuery(final Query query,
			final int pageSize, final int startIndex) {
		int beginno = 0;
		if (startIndex > 0) {
			beginno = (startIndex - 1) * pageSize + 1;
		}
		int totalsize = query.list().size();
		query.setFirstResult(beginno);
		query.setMaxResults(pageSize);
		List list = (List) query.list();

		return new PaginationSupport(list, totalsize, startIndex);
	}

}
